iT邦幫忙

2025 iThome 鐵人賽

DAY 13
0
Software Development

沒測試也敢重構?IDE 安全重構 30 日生存指南系列 第 15

Day 15. if 的世界線之 2:不同世界線的收束與發散

  • 分享至 

  • xImage
  •  

昨天已經看到了 if 的各種型態轉換。有時候我們真的需要伸手去整理這些條件,Rider 也提供很多便捷的小技巧,可以最大幅度地減少我們手動修改條件判斷的機會。

1. Merge Two 'if's

沿用昨天的例子,這次我不用 Invert If,而是從另一個方向來整理。
https://ithelp.ithome.com.tw/upload/images/20250930/20169414oiUJxQFM2X.png

按下 Show Context Actions,選擇 Merge Two 'if's
https://ithelp.ithome.com.tw/upload/images/20250930/20169414qnVmKnIOwe.png

可以看到兩層的 if 被壓縮成一層了。
https://ithelp.ithome.com.tw/upload/images/20250930/20169414eWWKPyPBAt.png

再做一次。雖然循環複雜度沒有減少,但減少了兩層的巢狀結構,對可理解性來說還是幫助非常大。
https://ithelp.ithome.com.tw/upload/images/20250930/20169414TCR1bnh53B.png

還是有點習慣 Early Return 的寫法,再做一次 Invert If
https://ithelp.ithome.com.tw/upload/images/20250930/20169414vUlpoi1T5y.png

即使我早就忘記什麼是 De Morgan's Laws 也沒關係,Rider 會幫我把 if 整理地好好的。
https://ithelp.ithome.com.tw/upload/images/20250930/201694146ux0JupQSi.png

2. Flip Operands

中午吃飯前 PM 跑來跟我說,沒付錢的訂單不能算 Failed,要算 Pending。這個目標跟現在這個寫法有點遠,我打算先把它整理成適合修正的形狀。選取 Flip '||' Operands
https://ithelp.ithome.com.tw/upload/images/20250930/20169414AwozGv0u4a.png

如此就把 IsPaid 的判斷調換位置,搬到最後面了。
https://ithelp.ithome.com.tw/upload/images/20250930/20169414a877mmfNIO.png

3. Split Into Two 'if' Statements

接著這次選擇 Split Into Two 'if' Statements
https://ithelp.ithome.com.tw/upload/images/20250930/20169414Nf1vlnVnlg.png

這樣就把不同情境的條件拆開了。
https://ithelp.ithome.com.tw/upload/images/20250930/20169414egfrSAUBN7.png

現在的寫法要調整邏輯就很簡單。
https://ithelp.ithome.com.tw/upload/images/20250930/20169414tvjmH2q6CP.png

注意事項

細心的人會注意到,Rider 並不是所有操作都符合重構「不改變行為」的定義。Rider 會特別將這類的操作標示為「會改變語意」 (chage semantics)。
https://ithelp.ithome.com.tw/upload/images/20250930/20169414TWQ2qQqZ9t.png

一如昨天所說,條件式的修改往往是 bug 發生的地方,非到不得已是不會手動修改的。而即使 Rider 提供很多方便的操作,遇到一些比較複雜的情況,我甚至會畫真值表來驗算。當然,如果條件允許的話最好還是補個測試,即使我們知道怎麼做安全重構,也難保下一個修改的同事會不會又把它改壞。咦,我怎麼說又?


上一篇
Day 14. if 的世界線:如果我能讓它變簡單......
下一篇
Day 16. if 的世界線之 3:斬斷冗余的枷鎖
系列文
沒測試也敢重構?IDE 安全重構 30 日生存指南17
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言